#!/bin/bash

############################################################################
#
# 远程执行该脚本，请在命令行中直接执行以下命令：
#
#   curl -sSL https://gitee.com/tay3223/biubiubiu/raw/master/centos7-accelerate-pip.sh | /bin/bash
#
#
############################################################################
# 全面检查系统是否可以下线的脚本
# 功能 = 全局检查 + 端口级检查

echo "====================="
echo "检查时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "====================="

########################################
# 1. 用户登录情况
########################################
echo -e "\n=== 1. 当前在线用户 ==="
who || echo "who 命令执行失败"
echo "---"
w || echo "w 命令执行失败"

########################################
# 2. 登录历史
########################################
echo -e "\n=== 2. 最近 5 次登录记录 ==="
last -n 5 || echo "last 命令执行失败"

########################################
# 3. 全局网络连接
########################################
echo -e "\n=== 3. 活跃网络连接数（排除 TIME_WAIT） ==="
ss -tunap | grep -v TIME_WAIT | wc -l
echo "--- 详细连接情况 (前20行) ---"
ss -tunap | grep -v TIME_WAIT | head -n 20

########################################
# 4. 正在监听端口
########################################
echo -e "\n=== 4. 正在监听的端口 ==="
ss -tulnp | grep LISTEN

########################################
# 5. MySQL 检查
########################################
echo -e "\n=== 5. 检查 MySQL 连接数 ==="
MYSQL_BIN=$(pgrep -x mysqld > /dev/null && echo "yes" || echo "no")
if [ "$MYSQL_BIN" == "yes" ]; then
    if command -v mysql >/dev/null 2>&1; then
        CONNECTS=$(mysql -uroot -e "show processlist;" 2>/dev/null | wc -l)
        if [ "$CONNECTS" -gt 0 ]; then
            CONNECTS=$((CONNECTS - 1))  # 减去表头行
        fi
        echo "当前 MySQL 连接数: $CONNECTS"
        mysql -uroot -e "show processlist;" 2>/dev/null | head -n 10
    else
        echo "⚠️ 未安装 mysql 客户端，请手动检查连接。"
    fi
else
    echo "未检测到 mysqld 进程"
fi

########################################
# 6. 网卡流量
########################################
echo -e "\n=== 6. 网卡流量 (sar -n DEV 1 3，只统计 eth0/ens系) ==="
if command -v sar >/dev/null 2>&1; then
    IFACE=$(ip route | grep '^default' | awk '{print $5}' | head -n1)
    if [ -n "$IFACE" ]; then
        echo "检测到主网卡: $IFACE"
        sar -n DEV 1 3 | grep "$IFACE" || echo "⚠️ 未找到网卡 $IFACE 的流量信息"
    else
        echo "⚠️ 未检测到默认网卡"
    fi
else
    echo "⚠️ sar 未安装，可以执行: yum install -y sysstat"
fi

########################################
# 7. 深度端口检查函数
########################################
check_port () {
  PORT=$1
  
  # 输入验证
  if ! [[ "$PORT" =~ ^[0-9]+$ ]] || [ "$PORT" -lt 1 ] || [ "$PORT" -gt 65535 ]; then
    echo "⚠️ 无效端口号: $PORT"
    return 1
  fi
  
  echo -e "\n==== [端口 $PORT] 深度分析 ===="
  ss -lntp | grep ":$PORT " || echo "⚠️ 未发现监听 $PORT 的进程"

  # 使用更可靠的方法获取PID
  PID=$(ss -lntp | grep ":$PORT " | sed -n 's/.*pid=\([0-9]*\).*/\1/p' | head -n1)
  
  # 如果ss方法失败，尝试使用lsof
  if [ -z "$PID" ] && command -v lsof >/dev/null 2>&1; then
    PID=$(lsof -ti:$PORT | head -n1)
  fi

  if [ -n "$PID" ]; then
    echo -e "\n>> 进程信息 (PID=$PID)："
    ps -fp $PID 2>/dev/null || echo "⚠️ 无法获取进程信息，可能权限不足"

    echo -e "\n>> 完整启动命令："
    if [ -r "/proc/$PID/cmdline" ]; then
      tr '\0' ' ' < /proc/$PID/cmdline 2>/dev/null ; echo
    else
      echo "⚠️ 无法读取进程启动命令，可能权限不足"
    fi

    echo -e "\n>> 当前活跃连接数 (ESTABLISHED)："
    ESTAB_COUNT=$(ss -ntp | grep ":$PORT " | grep ESTAB | wc -l)
    echo "$ESTAB_COUNT"

    echo -e "\n>> 最多连接的来源 IP (TOP 10)："
    if [ "$ESTAB_COUNT" -gt 0 ]; then
      ss -ntp | grep ":$PORT " | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head
    else
      echo "当前无活跃连接"
    fi

    # 检查多种日志文件参数格式
    if [ -r "/proc/$PID/cmdline" ]; then
      LOGFILE=$(tr '\0' '\n' < /proc/$PID/cmdline 2>/dev/null | grep -E "(logging.file=|--log-file=|--logfile=)" | cut -d= -f2 | tail -n1)
      if [ -n "$LOGFILE" ] && [ -f "$LOGFILE" ] && [ -r "$LOGFILE" ]; then
          echo -e "\n>> 应用日志文件（最后 10 行）：$LOGFILE"
          tail -n 10 "$LOGFILE" 2>/dev/null || echo "⚠️ 无法读取日志文件"
      else
          echo -e "\n>> 未检测到可访问的日志文件参数"
      fi
    fi
  fi
}

########################################
# 8. 针对常见关键端口做分析
########################################
for P in 22 3306 8080 8090; do
  check_port $P
done

echo -e
